Ziskani focusu

Otázka od: Ing. Igor Kapoun

6. 9. 2004 12:13

Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
podobne, jako kdybych na ni kliknul mysi.
Dik za nakopnuti.
Igor


Odpovedá: Jiri Cincura

6. 9. 2004 12:39

Ing. Igor Kapoun wrote:
> Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
> podobne, jako kdybych na ni kliknul mysi. Dik za nakopnuti.
> Igor

SetForegroundWindow by nepomohlo?

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Sebesta Jan

6. 9. 2004 12:31

neco.setfocus -staci?

-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Ing. Igor Kapoun
Sent: Monday, September 06, 2004 12:47 PM
To: delphi-l@clexpert.cz
Subject: Ziskani focusu

Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
podobne, jako kdybych na ni kliknul mysi.
Dik za nakopnuti.
Igor




Odpovedá: Karel Halamasek

6. 9. 2004 13:40

Staci napsat napriklad:

   DBEdit1.SetFocus; // fokus na zvoleny objekt

Karel Halamasek


Dne Mon, 6 Sep 2004 13:25:25 +0200 napsal/-a Sebesta Jan <sebesta@cube.cz>
zpravu nasledujiciho zneni:

> neco.setfocus -staci?
>
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
> Behalf Of Ing. Igor Kapoun
> Sent: Monday, September 06, 2004 12:47 PM
> To: delphi-l@clexpert.cz
> Subject: Ziskani focusu
>
> Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
> podobne, jako kdybych na ni kliknul mysi.
> Dik za nakopnuti.
> Igor
>
>
>
>
>
>
>
>



--
Preji hezky den.
Karel Halamasek COMPRO

Odpovedá: Jiri Cincura

6. 9. 2004 14:22

Sebesta Jan wrote:
> neco.setfocus -staci?
>

Myslim, ze tazatel myslel celou app, kdyz je treba prekryta jinou, ne? Nebo
jen prvek na formu?

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Ing. Igor Kapoun

6. 9. 2004 14:44

Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.

> SetForegroundWindow by nepomohlo?

 Zkousel jsem toto:

if SetForegroundWindow (Application.Handle)
        then Caption := 'OK'
        else Caption := SysErrorMessage(GetLastError);
 Pokud melo okno aplikace focus, bylo to OK, jak jsem aktivoval jinou
aplikaci, chybova hlaska byla "Parametr neni spravny"


Odpovedá: Pavol Stugel, NETGraphics

6. 9. 2004 15:19

ShowWindow(Application.Handle, SW_SHOW);

palo


> Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.


Odpovedá: Jiri Cincura

6. 9. 2004 15:34

Ing. Igor Kapoun wrote:
> Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.
>
>> SetForegroundWindow by nepomohlo?
>
> Zkousel jsem toto:
>
> if SetForegroundWindow (Application.Handle)
> then Caption := 'OK'
> else Caption := SysErrorMessage(GetLastError); Pokud melo okno
> aplikace focus, bylo to OK, jak jsem aktivoval jinou aplikaci, chybova
> hlaska byla "Parametr neni spravny"

Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na panelu.
Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.

OK mi to hlasi, kdyz jsem v jine app a dokonce se i prenese do popredi.  

Kde to volas? Nekde bude asi problem, nebo zkus nastavit jako HWND
Form1.Handle (uprav podle sebe).

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net



Odpovedá: Petr Vones

6. 9. 2004 15:28

From: "Jiri Cincura" <diskuze@cincura.net>
> Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na panelu.
> Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.

viz TJclAppInstances.BringAppWindowToFront v JCL

Petr Vones


Odpovedá: Ing. Igor Kapoun

6. 9. 2004 15:36

> > if SetForegroundWindow (Application.Handle)
> > then Caption := 'OK'
> > else Caption := SysErrorMessage(GetLastError); Pokud melo okno
> Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na
panelu.
> Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.
>
> OK mi to hlasi, kdyz jsem v jine app a dokonce se i prenese do popredi.  
>
> Kde to volas? Nekde bude asi problem, nebo zkus nastavit jako HWND
> Form1.Handle (uprav podle sebe).

W98, D6,
V aplikaci mam jediny timer, ktery tika po 10 sec. a provadi vyse uvedeny
kok. Kdyz to sam zafocusuji, tak je to OK, jinak "Parametr neni spravny", a
blika na panelu...

Kdyz zkusim

if ShowWindow(Application.Handle, SW_SHOW)
        then Caption := 'OK'
        else Caption := SysErrorMessage(GetLastError);
tak je to OK porad, na panelu neblika nic, ale nic se taky nefocusuje.

Igor


Odpovedá: Pavol Stugel, NETGraphics

6. 9. 2004 15:50

> Kdyz zkusim
>
> if ShowWindow(Application.Handle, SW_SHOW)
> then Caption := 'OK'
> else Caption := SysErrorMessage(GetLastError);
> tak je to OK porad, na panelu neblika nic, ale nic se taky nefocusuje.
>
tak toto uz musi fachat:
function ForceForeground(const Handle1: THandle): Boolean;
const
   SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
   SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
   ForegndThreadID: DWORD;
   TheThreadID : DWORD;
   timeout : DWORD;
   OSVersionInfo: TOSVersionInfo;
   hParent: THandle;
   AniInfo: TAnimationInfo;
   Animate: Boolean;
begin
if IsIconic(Handle1) then ShowWindow(Handle1, SW_RESTORE);
hParent := GetWindowLong(Handle1, GWL_HWNDPARENT);
if hParent > 0 then
   if IsIconic(hParent) then ShowWindow(hParent, SW_RESTORE);

   if (GetForegroundWindow = Handle1) then Result := true
   else
     begin
     OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
     GetVersionEx(OSVersionInfo);

     if ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and
(OSVersionInfo.dwMajorVersion > 4))
     or
     ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) and
((OSVersionInfo.dwMajorVersion > 4)
     or
     ((OSVersionInfo.dwMajorVersion = 4) and (OSVersionInfo.dwMinorVersion >
0))))
     then
       begin // OS is above win 95
       Result := false;
       ForegndThreadID := GetWindowThreadProcessID(GetForegroundWindow,nil);
       TheThreadID := GetWindowThreadProcessId(Handle1,nil);
       if AttachThreadInput(TheThreadID, ForegndThreadID, true) then
         begin
         SetForegroundWindow(Handle1);
         AttachThreadInput(TheThreadID, ForegndThreadID, false);
         Result := (GetForegroundWindow = Handle1);
         end;
       if not Result then
         begin
         SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil,
SPIF_SENDCHANGE);
         SetForegroundWindow(Handle1);
         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @timeout,
SPIF_SENDCHANGE);
         end;

       end else // OS is above win 95
       SetForegroundWindow(Handle1);

   Result := (GetForegroundWindow = Handle1);
   if Result then Exit;

   AniInfo.cbSize := SizeOf(TAnimationInfo);
   if SystemParametersInfo(SPI_GETANIMATION, SizeOf(AniInfo), @AniInfo, 0) then
     Animate := AniInfo.iMinAnimate <> 0 else
     Animate := False;
   if Animate then
     begin
     AniInfo.iMinAnimate := 0;
     SystemParametersInfo(SPI_SETANIMATION, SizeOf(AniInfo), @AniInfo, 0);
     end;
   SendMessage(Handle1,WM_SYSCOMMAND,SC_MINIMIZE,0);
   Sleep(40);
   if hParent > 0 then
   SendMessage(hParent,WM_SYSCOMMAND,SC_RESTORE,0)
   else
   SendMessage(Handle1,WM_SYSCOMMAND,SC_RESTORE,0);
   if Animate then
   begin
   AniInfo.iMinAnimate := 1;
   SystemParametersInfo(SPI_SETANIMATION, SizeOf(AniInfo), @AniInfo, 0);
   end;

   Result := (GetForegroundWindow = Handle1);
   end;
end;


palo